package com.webdesign.util;

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;

import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import com.opensymphony.xwork2.ActionContext;


public class UnRarUtil {
	/**   
	    * 解压rar格式压缩包。   
	    * 对应的是junrar-0.7.jar，  
	    */    
	public Boolean unrar(String homeworkid,File upFile) throws Exception{      
		/*
		 * upfile,上传的文件
		 * filesum,作业总文件夹爱
		 * fileid,作业号文件夹
		 * force,学生作业解压缩文件夹
		 */
		File filesum = null;
		File fileid = null;
		File force = null;
		String root = this.getClass().getResource("/").getFile().toString();
		String rt[] = root.split("/WEB-INF");
		String id[] = homeworkid.split("_");
		Map<String, Object> session = ActionContext.getContext().getSession();
		//userid，学号
		String userid = (String)session.get("userid");
		
		Archive a = null;
		filesum = new File(rt[0] + "\\homework");
		if(!filesum.exists()){ 
			filesum.mkdirs(); 
			} 		
		fileid = new File(filesum + "\\homework" + id[1]);
		if(!fileid.exists()){ 
		    fileid.mkdirs(); 
		    }         
		FileOutputStream fos = null;          
		try{ 
			a = new Archive(upFile);  
			//文件头，根据文件头可以判断文件类型
			FileHeader fh = null; 
			for(fh = a.nextFileHeader();fh!=null;fh = a.nextFileHeader()){    
				//获取待解压缩文件的文件名，去除文件名中的空格
	    		String compressFileName = fh.getFileNameString().trim(); 
	    		//将待解压缩文件的文件名中的所有\\\\替换为/
	    		String unrarFileName= compressFileName.replaceAll("\\\\", "/");
	    		//根据/分解带解压缩文件的文件名
	    		String str[] = unrarFileName.split("/");
	    		//newrarname，解压后的文件的名字
	    		String newrarname = userid + "_" +id[1];
	    		force = new File(fileid + "\\" + newrarname);
		        if(!force.exists()){ 
		        	force.mkdirs(); 
		        	} 
		        File file = null;
		        //length,待解压缩文件的文件名的长度
	    		int length = str.length;
	    		//获取待解压缩文件的文件名的最底层
	    		String testr = str[length-1];
	    		//"."在java中具有特殊意义，必须使用转义符
	    		String nestr[] = testr.split("\\.");
	    		if(nestr.length >= 2){
	    			//如果最底层的文件含有后缀，说明不是文件夹
	    			String filestr = newrarname;
	    			for(int j=0;j<=length-2;j++){
	    				filestr = filestr + "\\" + str[j];
	    				}
	    			file = new File(filesum + "\\homework" + id[1] + "\\" + filestr);
		        	} 
	    		else{
	    			file = new File(force + "\\" + unrarFileName);
	    			}
	    		//输出路径
	    		String outPath = force + "\\" + unrarFileName;
	    		if(!file.exists()){     
	    			file.mkdirs();     
	    			}             
	    		if(new File(outPath).isDirectory()){ 
	    			continue;
	    			} 
	    		//解压缩文件     
	    		fos = new FileOutputStream(outPath);     
	    		a.extractFile(fh, fos);     
	    		fos.close();     
	    		fos = null; 
	    	}     
			a.close();     
			a = null;      
		}catch(Exception e){     
			throw e;     
		}finally{     
			if(fos!=null){     
				try{fos.close();fos=null;}catch(Exception e){e.printStackTrace();}     
			}     
			if(a!=null){     
				try{a.close();a=null;}catch(Exception e){e.printStackTrace();}     
			}     
		} 
		return true;
	}     
}
